Qt5.4文档翻译:QDomDocument类,QDomDocument Class
QDomDocument 类代表着一个XML 文档。 详细说明……
头文件: |
#include <QDomDocument> |
qmake指令: |
QT += xml |
继承: |
注意 : 这个类中的函数都是 可重入的 ,例外 是 setContent () ,它是不可重入的。
QDomDocument 类代表着一个XML 文档。
QDomDocument 类代表着整个XML 文档。概念 上来讲,它是文档树的根节点,并且提供了一些首要 的手段来访问文档中的数据。
由于 ,元素、文本节点、注释、处理指令等等东西都无法在文档上下文之外存在,所以, 在文档类中,也包含了一些工厂函数,用来创建这些对象。对于 被创建的节点对象,会有一个 ownerDocument ()函数 , 它返回的就是,那些节点 被于其中创建的上下文所对应的文档。 最常用的 DOM 类包括: QDomNode 、 QDomDocument 、 QDomElement 和 QDomText 。
被解析的 XML ,在内部是以一个对象树的形式来表示的, 可使用各种各样 的QDom 类对它们进行访问。所有 的QDom 类, 都只对内部树中的对象进行 引用 。 一旦最后一个引用它的QDom 对象或者整个 QDomDocument 本身被删除了,DOM 树中对应的内部对象就会被删除。
元素、文本节点等等对象的创建,是使用这个类中的各种工厂函数来实现的。如果妳使用各个QDom 类的默认构造函数,那么,结果将产生空白的对象,它们无法被操作,也无法被插入到文档中。
QDomDocument 类中有多个函数,可用来创建文档数据,例如: createElement () 、 createTextNode () 、 createComment () 、 createCDATASection () 、 createProcessingInstruction () 、 createAttribute () 和 createEntityReference () 。其中某些函数具有对应 的支持命名空间的版本, 也就是说, createElementNS () 和 createAttributeNS () 。 createDocumentFragment ()函数 可用来持有文档 中的某些部分; 这一点,在处理复杂文档的时候狠有用。
文档 的整个内容是使用 setContent ()函数来设置的。 这个函数,会把被传入的字符串 当 作一个XML 文档来解析,并且创建 出代表着该文档的DOM 树。 根元素可通过 documentElement ()函数来访问。 该文档的字符串表示形式,可通过 toString ()函数来获取。
注意 : 如果 该 XML 文档狠大的话,那么,对应 的 DOM 树可能会占用大量 的内存。对于 这种类型的文档,建议使用 QXmlStreamReader 或 QXmlQuery 类。
可以使用 importNode ()来将另一个文档中的某个节点插入到当前文档中。
妳可以使用 elementsByTagName ()或 elementsByTagNameNS ()来获取到所有具有特定标记名字的元素的列表。
那些QDom 类,一般是这样使用的:
QDomDocument doc("mydocument");
QFile file("mydocument.xml");
if (!file.open( QIODevice ::ReadOnly))
return;
if (!doc.setContent(&file)) {
file.close();
return;
}
file.close();
// 输出最外层元素的所有直接子代元素的名字。
QDomElement docElem = doc. documentElement ();
QDomNode n = docElem. firstChild ();
while(!n.isNull()) {
QDomElement e = n.toElement(); // 尝试 将该节点转换为一个元素。
if(!e.isNull()) {
cout << qPrintable (e.tagName()) << endl; // 该节点确实是一个元素。
}
n = n.nextSibling();
}
// 将一个新元素追加到文档的末尾
QDomElement elem = doc. createElement ("img");
elem.setAttribute("src", "myimage.png");
docElem. appendChild (elem);
一旦 doc 和 elem 离开了它们的作用域,则,代表 着该 XML 文档的整个内部树都会被删除。
要使用 DOM 来创建一个文档,则使用类似如下的代码:
QDomDocument doc("MyML");
QDomElement root = doc. createElement ("MyML");
doc. appendChild (root);
QDomElement tag = doc. createElement ("Greeting");
root. appendChild (tag);
QDomText t = doc. createTextNode ("Hello World");
tag. appendChild (t);
QString xml = doc. toString ();
欲知更多关于文档对象模型(Document Object Model)的信息, 则阅读文档对象模型(Document Object Model (DOM)) 级别1 和 级别2核心 规范。
这个函数,会对来自于字节数组 data 的XML 文档进行解析,并且将它设置为文档的内容。它会尝试按照XML 规范的要求来检测文档的编码。
如果namespaceProcessing 为真(true),则,解析器会识别XML 文件中的命名空间,并且将前缀名字、本地名字和命名空间URI 设置为适当的值。如果 namespaceProcessing 为假(false),则,解析器不会在读取XML 文件时进行命名空间处理。
如果解析过程 中出现错误,则, 这个函数会返回假( false ),并且 ,错误信息 会放置在 * errorMsg 中,错误处的行号会放置在 * errorLine 中,列号会放置在 * errorColumn 中(除非相应 的指针被设置为 0);否则 ,此函数会返回真( true )。 在 QXmlParseException 类的文档中说明了各种各样的错误消息。注意 ,如果 妳想要将这些错误消息显示在用户看的话,它们会被显示为英文的,除非妳明确地翻译它们。
如果 namespaceProcessing 为真(true),则, QDomNode::prefix ()这个函数会针对所有的元素和属性返回一个字符串。如果 该元素或属性没有前缀,则,会返回一个空白的字符串。
对于那些 只由空白字符组成的文本节点,它们 会被裁剪 ,并且不会出现在 QDomDocument 中。如果 妳无法接受这个行为,那么, 妳可以使用重载的以 QXmlReader 为参数的setContent()函数。
如果 namespaceProcessing 为假(false),则, QDomNode::prefix () 、 QDomNode::localName ()和 QDomNode::namespaceURI ()函数会返回空白字符串。
实体引用是按照以下方式来处理的:
•. 对于内容 中出现的 内部 的通用实体和字符实体的引用,会被包含。结果 将是一个 QDomText 节点, 其引用内容会替换为对应的实体的值。
•. 对于内部子集 中出现的参数实体的引用,会被包含。结果 将是一个 QDomDocumentType 节点,其中包含 着实体 和标记声明,并且 其引用内容会替换为对应的实体的值。
•. 任何 一个通用的被解析的实体引用,如果它不是被定义在内部子集中,并且又在内容中出现了,那么,会使用一个 QDomEntityReference 节点来表示。
•.任何一个解析出来的实体引用,如果它不是被定义在内部子集中,并且不在内容中出现,那么,其内容会被一个空白字符串替换。
•.任何一个未能被解析的实体引用,会被替换为空白字符串。
警告: 这个函数是 不可重入的 。
参考 QDomNode::namespaceURI () 、 QDomNode::localName () 、 QDomNode::prefix () 、 QString::isNull () 和 QString::isEmpty () 。
这是一个重载函数。
这个函数会从字符串 text 中读取XML 文档,如果内容被成功解析,则返回真(true);否则返回 假( false )。由于 text 已经 是一个Unicode 字符串,所以,不会进行编码检测。
这是一个重载函数。
这个函数会从字符串 text 中读取XML 文档,如果内容被成功解析,则返回真(true);否则返回 假( false )。由于 text 已经 是一个Unicode 字符串,所以,不会进行编码检测。
不会进行命名空间处理。
将解析到的文档重新转换为其文本表示形式。
这个函数,会使用 indent 个空格来对子元素进行缩进。
如果indent 为-1,则,不会添加空格。
巧慧
八福晋
HxLauncher: Launch Android applications by voice commands